/**
 * @file example_001.c
 * @author 逆流 (1171267147@qq.com)
 * @brief 遍历指定目录下的所有文件并按时间排序
 * @version 1.0
 * @date 2025-07-01
 *
 * @copyright Copyright (c) 2025
 *
 */
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <time.h>
#include <unistd.h>

#define MAX_FILES 256

typedef struct {
    char   name[256];
    time_t mtime;
} FileEntry;

// 比较函数用于排序
int compare_mtime(const void *a, const void *b) {
    FileEntry *fileA = (FileEntry *)a;
    FileEntry *fileB = (FileEntry *)b;
    if (fileA->mtime < fileB->mtime) return -1;
    if (fileA->mtime > fileB->mtime) return 1;
    return 0;
}

int main(int argc, char *argv[]) {
    DIR           *dir;
    struct dirent *entry;
    struct stat    fileStat;
    FileEntry      files[MAX_FILES];
    int            count = 0;

    if (argc > 1) {
        // 切换到目标目录下，通过entry->d_name获取的文件名为相对路径名
        if (-1 == chdir(argv[1])) {
            perror("chdir failed!");
            return 1;
        }
    }

    dir = opendir(".");

    if (!dir) {
        perror("opendir failed!");
        return 1;
    }

    // 编译当前目录下的所有文件
    while ((entry = readdir(dir)) != NULL) {
        // 忽略 . 和 ..
        if (entry->d_name[0] == '.' &&
            (entry->d_name[1] == '\0' || (entry->d_name[1] == '.' && entry->d_name[2] == '\0'))) {
            continue;
        }

        // 获取文件状态信息
        if (stat(entry->d_name, &fileStat) == 0) {
            strncpy(files[count].name, entry->d_name, sizeof(files[count].name) - 1);
            files[count].mtime = fileStat.st_mtime;
            count++;
            if (count >= MAX_FILES) break;  // 防止数组越界
        }
    }

    closedir(dir);

    // 按照最后修改时间排序
    qsort(files, count, sizeof(FileEntry), compare_mtime);

    // 输出结果
    printf("Sorted by modification time:\n");
    for (int i = 0; i < count; i++) {
        char      time_str[32];
        struct tm time_info;
        // 换算为当地时间
        localtime_r(&files[i].mtime, &time_info);
        // ctime_r(&files[i].mtime, time_str);
        // 格式化时间信息
        strftime(time_str, sizeof(time_str), "%Y年%m月%d日 %H:%M:%S", &time_info);
        time_str[strlen(time_str) - 1] = '\0';  // 去掉换行符
        printf("%s\t%s\n", time_str, files[i].name);
    }

    return 0;
}
